package 蚂蚁课堂;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * tryAcquire(int permits) 方法讲解：
 * 他是像信号量中尝试获取指定个数的许可证，若当前信号量仅有10个许可证，而该线程要获取20个许可证，
 * 这种情况下就是：他确实有许可证，但是信号量中的许可证不足，那么此时该方法会返回false,
 * 返回了false，则表示获取许可证失败，所以信号量中的许可证不会变，依然是1个
 * 只有tryAcquire返回true，信号量中的许可证才会减少permits个
 */
public class SemaphoreDemo3 {

    public static void main(String[] args) throws InterruptedException {
        final Semaphore semaphore=new Semaphore(7);

        for (int i=0;i<20;i++){
            final int j=i;
            new Thread(new Runnable() {
                public void run() {
                    if (j==0){
                        /**
                         * new Semaphore(7)仅有7个许可证，而第一个线程要一次获取30个，则返回false,
                         * semaphore中的许可证不会减少，还是7个
                         */
                        boolean b = semaphore.tryAcquire(30);
                        if (b){
                            System.out.println(Thread.currentThread().getName()+"秒杀成功");
                        }else {
                            System.out.println(Thread.currentThread().getName()+"库存不足");
                        }
                    }else {
                        /**
                         * 尝试一次获取2个许可证，7/2=3...1  则有3个线程购买商品成功，那么最后还会剩下一个许可证
                         * 因为每次获取的是2个许可证，当获取到第6个的时候，此时还剩1个，后面的所有semaphore.tryAcquire(2)
                         * 都会返回false
                         */
                        boolean b = semaphore.tryAcquire(2);
                        if (b){
                            System.out.println(Thread.currentThread().getName()+"秒杀成功");
                        }else {
                            System.out.println(Thread.currentThread().getName()+"库存不足");
                        }
                    }


                }
            },i+"").start();
        }
        TimeUnit.SECONDS.sleep(3);
        System.out.println(semaphore.availablePermits());
    }
}
